package com.albaba.designpattern.proxy.text_002;

import com.albaba.designpattern.proxy.text_001.UserDaoProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Description: 动态生成代理对象
 * @Author zx
 * @Date 2025/2/20 13:43
 * @Version 1.0
 */
public class ProxyFactory {

    // 维护一个目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 为目标对象生成代理对象
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(
                // 目标类使用的类加载器
                target.getClass().getClassLoader(),
                // 目标对象实现的接口类型
                target.getClass().getInterfaces(),
                // 事件处理器
                new InvocationHandler() {
                    /**
                     * @param proxy 代理对象
                     * @param method 对应于在代理对象上调用的接口方法实例
                     * @param args 对应了代理对象在调用接口方法时传入的实际参数
                     * @return java.long.Object 返回目标对象的方法返回值，没有返回值则为null
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("开启事务");
                        method.invoke(target, args);
                        System.out.println("提交事务");
                        return null;
                    }
                }

        );
    }
}
